package ec.linde.persistencia.entidades.proyectos;

import static javax.persistence.GenerationType.IDENTITY;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import ec.linde.enumeraciones.Estado;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/09/2014
 * @author: Alex Carrillo
 * @FechaModificacion: 29/09/2014
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Entity
@Table(name = "prod_planilla_contr", schema = "productividad")
public class PlanillaContratista extends EntidadBase {

	private static final long serialVersionUID = 3935545106378163867L;

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "plco_id", unique = true, nullable = false)
	private int idPlanillaContratista;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "rdo_id", nullable = false)
	@NotNull
	private Rdo rdo;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "planillaContratista")
	private List<DetallePlanillaContratista> listaDetallePlanillaContratista = new ArrayList<DetallePlanillaContratista>();

	@Column(name = "plco_estado", nullable = false)
	@Enumerated(EnumType.STRING)
	private Estado estado;

	@Temporal(TemporalType.DATE)
	@Column(name = "plco_fecha", nullable = false)
	@NotNull
	private Date fecha;

	@Column(name = "plco_subtotal_costo_total", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal subtotalCostoTotal = BigDecimal.ZERO;

	@Column(name = "plco_porcentaje_impuesto", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal porcentajeImpuesto = BigDecimal.ZERO;

	@Column(name = "plco_impuesto_costo_total", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal impuestoCostoTotal = BigDecimal.ZERO;

	@Column(name = "plco_total_costo_total", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal totalCostoTotal = BigDecimal.ZERO;

	@Column(name = "plco_subtotal_costo_act", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal subtotalCostoActual = BigDecimal.ZERO;

	@Column(name = "plco_impuesto_costo_act", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal impuestoCostoActual = BigDecimal.ZERO;

	@Column(name = "plco_total_costo_act", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal totalCostoActual = BigDecimal.ZERO;

	@Column(name = "plco_subtotal_costo_ant", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal subtotalCostoAnterior = BigDecimal.ZERO;

	@Column(name = "plco_impuesto_costo_ant", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal impuestoCostoAnterior = BigDecimal.ZERO;

	@Column(name = "plco_total_costo_ant", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal totalCostoAnterior = BigDecimal.ZERO;

	@Column(name = "plco_subtotal", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal subtotal = BigDecimal.ZERO;

	@Column(name = "plco_impuesto", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal impuesto = BigDecimal.ZERO;

	@Column(name = "plco_total", nullable = false, precision = 12, scale = 6)
	@NotNull
	@Digits(integer = 12, fraction = 2)
	@Min(value = 0)
	private BigDecimal total = BigDecimal.ZERO;

	@Column(name = "plco_descripcion", nullable = true, length = 200)
	@Size(max = 200)
	private String descripcion;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.asinfo.as2.entities.EntidadBase#getId()
	 */
	@Override
	public int getId() {
		return this.idPlanillaContratista;
	}

	public int getIdPlanillaContratista() {
		return idPlanillaContratista;
	}

	public void setIdPlanillaContratista(int idPlanillaContratista) {
		this.idPlanillaContratista = idPlanillaContratista;
	}

	public Rdo getRdo() {
		return rdo;
	}

	public void setRdo(Rdo rdo) {
		this.rdo = rdo;
	}

	public List<DetallePlanillaContratista> getListaDetallePlanillaContratista() {
		return listaDetallePlanillaContratista;
	}

	public void setListaDetallePlanillaContratista(List<DetallePlanillaContratista> listaDetallePlanillaContratista) {
		this.listaDetallePlanillaContratista = listaDetallePlanillaContratista;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public BigDecimal getSubtotalCostoTotal() {
		return subtotalCostoTotal;
	}

	public void setSubtotalCostoTotal(BigDecimal subtotalCostoTotal) {
		this.subtotalCostoTotal = subtotalCostoTotal;
	}

	public BigDecimal getPorcentajeImpuesto() {
		return porcentajeImpuesto;
	}

	public void setPorcentajeImpuesto(BigDecimal porcentajeImpuesto) {
		this.porcentajeImpuesto = porcentajeImpuesto;
	}

	public BigDecimal getImpuestoCostoTotal() {
		return impuestoCostoTotal;
	}

	public void setImpuestoCostoTotal(BigDecimal impuestoCostoTotal) {
		this.impuestoCostoTotal = impuestoCostoTotal;
	}

	public BigDecimal getTotalCostoTotal() {
		return totalCostoTotal;
	}

	public void setTotalCostoTotal(BigDecimal totalCostoTotal) {
		this.totalCostoTotal = totalCostoTotal;
	}

	public BigDecimal getSubtotalCostoActual() {
		return subtotalCostoActual;
	}

	public void setSubtotalCostoActual(BigDecimal subtotalCostoActual) {
		this.subtotalCostoActual = subtotalCostoActual;
	}

	public BigDecimal getImpuestoCostoActual() {
		return impuestoCostoActual;
	}

	public void setImpuestoCostoActual(BigDecimal impuestoCostoActual) {
		this.impuestoCostoActual = impuestoCostoActual;
	}

	public BigDecimal getTotalCostoActual() {
		return totalCostoActual;
	}

	public void setTotalCostoActual(BigDecimal totalCostoActual) {
		this.totalCostoActual = totalCostoActual;
	}

	public BigDecimal getSubtotalCostoAnterior() {
		return subtotalCostoAnterior;
	}

	public void setSubtotalCostoAnterior(BigDecimal subtotalCostoAnterior) {
		this.subtotalCostoAnterior = subtotalCostoAnterior;
	}

	public BigDecimal getImpuestoCostoAnterior() {
		return impuestoCostoAnterior;
	}

	public void setImpuestoCostoAnterior(BigDecimal impuestoCostoAnterior) {
		this.impuestoCostoAnterior = impuestoCostoAnterior;
	}

	public BigDecimal getTotalCostoAnterior() {
		return totalCostoAnterior;
	}

	public void setTotalCostoAnterior(BigDecimal totalCostoAnterior) {
		this.totalCostoAnterior = totalCostoAnterior;
	}

	public BigDecimal getSubtotal() {
		return subtotal;
	}

	public void setSubtotal(BigDecimal subtotal) {
		this.subtotal = subtotal;
	}

	public BigDecimal getImpuesto() {
		return impuesto;
	}

	public void setImpuesto(BigDecimal impuesto) {
		this.impuesto = impuesto;
	}

	public BigDecimal getTotal() {
		return total;
	}

	public void setTotal(BigDecimal total) {
		this.total = total;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public BigDecimal getTotalCostoTarea() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetallePlanillaContratista detallePlanillaContratista : listaDetallePlanillaContratista) {
			if (!detallePlanillaContratista.isEliminado()) {
				total = total.add(detallePlanillaContratista.getCostoTotal());
			}
		}
		return total;
	}

	public BigDecimal getTotalCosto() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetallePlanillaContratista detallePlanillaContratista : listaDetallePlanillaContratista) {
			if (!detallePlanillaContratista.isEliminado()) {
				total = total.add(detallePlanillaContratista.getCostoTotal());
			}
		}
		return total;
	}

	public BigDecimal getTotalCostoPlanillaActual() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetallePlanillaContratista detallePlanillaContratista : listaDetallePlanillaContratista) {
			if (!detallePlanillaContratista.isEliminado()) {
				total = total.add(detallePlanillaContratista.getCostoActual());
			}
		}
		return total;
	}

	public BigDecimal getTotalCostoPlanillaAnterior() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetallePlanillaContratista detallePlanillaContratista : listaDetallePlanillaContratista) {
			if (!detallePlanillaContratista.isEliminado()) {
				total = total.add(detallePlanillaContratista.getCostoAnterior());
			}
		}
		return total;
	}

	public BigDecimal getTotalTotal() {
		BigDecimal total = BigDecimal.ZERO;
		for (DetallePlanillaContratista detallePlanillaContratista : listaDetallePlanillaContratista) {
			if (!detallePlanillaContratista.isEliminado()) {
				total = total.add(detallePlanillaContratista.getTotal());
			}
		}
		return total;
	}

}
